home *** CD-ROM | disk | FTP | other *** search
/ PC Player 2004 May / pc player 2004-05.iso / Demos / FarCry / Data1.cab / _AC883F1E46ED482A973EEAEE9F8E505A < prev    next >
Encoding:
Text File  |  2004-01-06  |  3.2 KB  |  101 lines

  1. // ===============================================================
  2. // Vertex Program: 
  3. // Description: 
  4. // Last Update: 14/08/2003
  5. // Coder: Andrey Honich
  6. // ===============================================================
  7.  
  8.       #include "../CGVPMacro.csi"
  9.  
  10.  
  11.       NoFog
  12.       MainInput
  13.       {
  14.         VIEWPROJ_MATRIX,
  15.         CAMERA_POS,
  16.         uniform float4 PosScale,
  17.         uniform float4 PosOffset,
  18.         uniform float3 ColorMinFresnel,
  19.         uniform float3 ColorMaxFresnel,
  20.         uniform float4 RippleTexGen0,
  21.         uniform float4 RippleTexGen1,
  22.         uniform float4x4 ReflectMatrix,
  23.         uniform float4 Constants,
  24.         uniform float4 WaterParams
  25.       }
  26.       DeclarationsScript
  27.       {
  28.         // define inputs from application
  29.         struct appin
  30.         {
  31.           float4 Position  : POSITION;
  32.           float3 Normal    : NORMAL;
  33.           float  HeightMap : BLENDWEIGHT;
  34.         };
  35.  
  36.         // define outputs from vertex shader
  37.         struct vertout
  38.         {
  39.           float4 HPosition  : POSITION;
  40.           float4 Tex0 : TEXCOORD0;
  41.           float4 Tex1 : TEXCOORD1;
  42.           float4 Color : COLOR0;
  43.           float3 Color1 : COLOR1;
  44.           float FogC : FOG;
  45.         };
  46.       }
  47.       CoreScript
  48.       {
  49.         float4 vPos = IN.Position * PosScale;
  50.         
  51.         // Apply curvature
  52.         float4 vCam = vPos - CameraPos;
  53.         vCam.z = 0;
  54.         float fSqCamDist = dot(vCam, vCam);
  55.         vPos.z = vPos.z + Constants.x * -fSqCamDist;
  56.         
  57.         // Scale height of the wave and normal depending on the water deep
  58.         float fHeightDelta = WaterParams.x - IN.HeightMap;
  59.         OUT.Color.w = fHeightDelta * WaterParams.w;
  60.         float fHeightScale = clamp(fHeightDelta * WaterParams.z, 0, 1);
  61.         vPos.z = vPos.z * fHeightScale;
  62.         float3 normal = IN.Normal;
  63.         normal.xy = normal.xy * fHeightScale;
  64.         normal = normalize(normal);
  65.                   
  66.         // Calculate fog
  67.         float4 posReal = vPos;
  68.         posReal.z = posReal.z + WaterParams.x;
  69.         vCam = posReal - CameraPos;
  70.         float fiDist = rsqrt(dot(vCam, vCam));
  71.         float fDist = 1 / fiDist;
  72.         OUT.FogC = fDist;
  73.         
  74.         // Don't deform near to camera 
  75.         float fScale = step(8, fDist);
  76.         vPos.z = vPos.z * fScale + WaterParams.x;
  77.  
  78.         // Normalize camera vector
  79.         vCam.xyz = vCam.xyz * fiDist;
  80.  
  81.         // Two sided lighting
  82.         float fDotNorm = dot(vCam.xyz, normal);
  83.         fDotNorm = fDotNorm * sign(fDotNorm);
  84.  
  85.         // calculate approximated fresnel term F
  86.         //                  1
  87.         // F = ---------------------------
  88.         //     ( 1 + E.N ) ^ Fresnel_Power_Factor
  89.         OUT.Color.xyz = fDotNorm.xxx;
  90.         float fFresnel = 1 / pow((fDotNorm + 1), Constants.y);
  91.         OUT.Color1.xyz = lerp(ColorMinFresnel, ColorMaxFresnel, fFresnel);
  92.         
  93.         OUT.HPosition = mul(ModelViewProj, vPos);
  94.         
  95.         OUT.Tex0.x = dot(vPos, RippleTexGen0);
  96.         OUT.Tex0.y = dot(vPos, RippleTexGen1);
  97.         
  98.         float4 vTexRefl = mul(ReflectMatrix, vPos);
  99.         OUT.Tex1.xy = vTexRefl.xy * (1 / vTexRefl.w);
  100.       }
  101.